how git works internally